#include <signal.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>	/* sleep */

/*
 * 使用捕获信号实现的异常 用来保证诸如段错误之类的错误发生时程序不会崩溃，而是跳过代码继续执行。
 *
 * typedef void (*sighandler_t)(int);
 * sighandler_t signal(int signum, sighandler_t handler);
 *
 *	1. 进入到信号处理函数之后 这个信号会被 阻塞（block） 直到信号处理函数返回。
 *	2. 信号函数处理完之后，会将该信号恢复为默认处理状态 ，即重新与产生core文件...函数绑定，
 *	   所以在下一次用到的时候要重新调用signal这个函数绑定
 */

//信号处理函数
void recvSignal(int sig)
{
	printf("received signal %d !!!\n",sig);
}

int main(int argc,char** argv)
{
	//给信号注册一个处理函数
	signal(SIGSEGV, recvSignal);

	int* s = 0;
	(*s) = 1;

	//以上两句用来产生 一个 传说中的段错误
	while(1)
	{
		sleep(1);
		printf("sleep 1 \n");
	}

	return 0;
}


#if 0

一直打印收到信号 11 （SIGSEGV），为什么呢 ，

上面代码给SIGSEGV 这个信号注册了一个处理函数 ，替代了系统默认的产生core文件的处理函数，当错误发生后，系统发送SIGSEGV，
然后中断了程序跳到 recvSignal 处理函数中去，处理完成后，再跳回来错误发生的地方，然后继续产生错误，继续发送SIGSEGV信号 ... 

使用 setjmp 和longjmp 尝试跳过错误堆栈  


#include <setjmp.h>
	int setjmp(jmp_buf env);   void longjmp(jmp_buf env, int val);
系统跳转函数 ，可以直接在函数之间跳转

#endif
